#include "DataProcessor.h"
#include <iostream>
#include <fstream>
#include <sstream>
#include <cmath>
#include <stdexcept>
#include <filesystem>

// 构造函数
DataProcessor::DataProcessor(const std::string& inputDir, const std::string& outputDir)
	: inputDir_(inputDir), outputDir_(outputDir) {

}

// 析构函数
DataProcessor::~DataProcessor() {

}


// 读取阻抗数据
std::map<double, double> DataProcessor::readImpedanceData(const std::string& filePath) {
	std::map<double, double> impedanceData;
	// 读取阻抗数据文件并存储
	// 假设 CSV 文件中第一列是频率，第四列是转换率
	// 实现方式与 `readCSV` 类似
	return impedanceData;
}



/**
 * data 要计算的数据
 * dataCount 要计算数据的长度
 * SamplingRate 采样率
 * sign 傅里叶变换的方向
 * flags FFTW 优化选项
 */
void DataProcessor::processFFT(std::vector<double>* data, uint32_t dataCount, double SamplingRate, fftw_complex* fft_in, fftw_complex* fft_out, fftw_plan fft_plan)
{
	std::vector<double> magnitudes;  // 幅度
	std::vector<double> phases;      // 相位
	std::vector<double> frequencies; // 频率数组

	// 将数据从时域转换为复数形式（实部和虚部都填充数据）
	for (uint32_t i = 0; i < dataCount; ++i) {
		fft_in[i][0] = (*data)[i];  // 实部为原始数据
		fft_in[i][1] = 0.0;         // 虚部为 0，假设数据是实数信号
	}

	// 执行 FFT 计算，fftw_execute 将会填充 fft_out 数组
	fftw_execute(fft_plan);

	// 计算频率、幅度和相位
	for (uint32_t i = 0; i < dataCount; ++i) {
		double real = fft_out[i][0]; // 获取 FFT 输出的实部
		double imag = fft_out[i][1]; // 获取 FFT 输出的虚部

		// 计算幅度：幅度为复数的模
		magnitudes.push_back(sqrt(real * real + imag * imag));

		// 计算相位：相位为复数的辐角
		phases.push_back(atan2(imag, real));

		// 计算频率：假设采样频率为 250 MHz
		frequencies.push_back(i * SamplingRate / dataCount);  // 频率 = 索引 * 采样频率 / 数据长度
	}

	// 释放 FFT 内存
	fftw_destroy_plan(fft_plan);
	fftw_free(fft_in);
	fftw_free(fft_out);
}


/**
 * @brief 处理多个文件的函数
 *
 * 该函数接收一个文件路径的列表，并为每个文件启动一个线程，利用线程池并发处理每个文件。
 * 每个文件的处理包括读取 CSV 数据、转换为电压值等操作。所有文件处理完成后，
 * 会进行 FFT 计算和结果保存。
 *
 * @param filePaths 文件路径的列表，包含多个要处理的 CSV 文件路径。
 */
//void DataProcessor::processFiles(const std::vector<std::string>& filePaths) {
//	// 用于存储每个文件处理的 future 对象
//	std::vector<std::future<void>> futures;
//
//	// 遍历每个文件路径
//	for (const auto& filePath : filePaths) {
//		// 为每个文件提交一个任务，异步执行 processCSV 函数
//		futures.push_back(std::async(std::launch::async, &DataProcessor::processCSV, this, filePath));
//	}
//
//	// 等待所有文件的处理任务完成
//	for (auto& future : futures) {
//		// 获取每个线程的结果（即等待线程完成），确保所有任务完成
//		future.get();
//	}
//
//	// 所有文件处理完成后，执行 FFT 计算
//	processFFT();
//
//	// 将计算结果保存到文件
//
//}

